Package org.jessma.hpsocket.unicode

Source Code of org.jessma.hpsocket.unicode.TcpServer

/*
* Copyright: JessMA Open Source (ldcsaa@gmail.com)
*
* Version  : 3.2.3
* Author  : Bruce Liang
* Website  : http://www.jessma.org
* Project  : https://github.com/ldcsaa
* Blog    : http://www.cnblogs.com/ldcsaa
* Wiki    : http://www.oschina.net/p/hp-socket
* QQ Group  : 75375912
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*      http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package org.jessma.hpsocket.unicode;

import org.jessma.hpsocket.Buffer;

import com.sun.jna.Native;
import com.sun.jna.NativeLong;
import com.sun.jna.Pointer;
import com.sun.jna.WString;

/** TCP Server 组件基类 (Unicode) */
public class TcpServer extends Server
{
  /** 创建组件对象 */
  public static TcpServer create(Mode mode)
  {
    TcpServer instance  = new TcpServer();
    instance.mode    = mode;
   
    switch(mode)
    {
    case PUSH:
      instance.socketListener  = HPSocket.SDK.Create_HP_TcpServerListener();
      instance.socketObj    = HPSocket.SDK.Create_HP_TcpServer(instance.socketListener);
      break;
    case PULL:
      instance.socketListener  = HPSocket.SDK.Create_HP_TcpPullServerListener();
      instance.socketObj    = HPSocket.SDK.Create_HP_TcpPullServer(instance.socketListener);
      break;
    default:
      assert false;
    }
   
    return instance;
  }
 
  /** 销毁组件对象 */
  public static void destroy(TcpServer server)
  {
    if(server.socketObj == null && server.socketListener == null)
      return;
   
    synchronized(server)
    {
      switch(server.mode)
      {
      case PUSH:
        if(server.socketObj != null)
          HPSocket.SDK.Destroy_HP_TcpServer(server.socketObj);
        if(server.socketListener != null)
          HPSocket.SDK.Destroy_HP_TcpServerListener(server.socketListener);
       
        break;
       
      case PULL:
        if(server.socketObj != null)
          HPSocket.SDK.Destroy_HP_TcpPullServer(server.socketObj);   
        if(server.socketListener != null)
          HPSocket.SDK.Destroy_HP_TcpPullServerListener(server.socketListener);
       
        break;
       
      default:
        assert false;
      }
     
      server.clearReferences();
    }
  }
 
  protected TcpServer()
  {
   
  }
 
  @Override
  protected void finalize() throws Throwable
  {
    destroy(this);
    super.finalize();
  }
 
  /* ********************************* TCP Server 组件操作方法 ****************************** */
 
  /** 发送小文件 */
  public boolean sendSmallFile(NativeLong dwConnID, String lpszFileName, byte[] pHead, byte[] pTail)
  {
    Buffer headBuffer = pHead != null ? new Buffer(pHead) : null;
    Buffer tailBuffer = pTail != null ? new Buffer(pTail) : null;
   
    return sendSmallFile(dwConnID, lpszFileName, headBuffer, tailBuffer);
  }

  /** 发送小文件 */
  public boolean sendSmallFile(NativeLong dwConnID, String lpszFileName, Buffer pHead, Buffer pTail)
  {
    long pMemHead    = 0;
    long pMemTail    = 0;
    Pointer pHeadBuffer = null;
    Pointer pTailBuffer = null;
   
    if(pHead != null)
    {
      pMemHead  = Native.malloc(Buffer.NATIVE_BUFFER_SIZE);
      pHeadBuffer  = new Pointer(pMemHead);
      pHeadBuffer.setInt(0, pHead.getLength());
      pHeadBuffer.setPointer(Pointer.SIZE, pHead.getPointer());
    }

    if(pTail != null)
    {
      pMemTail  = Native.malloc(Buffer.NATIVE_BUFFER_SIZE);
      pTailBuffer  = new Pointer(pMemTail);
      pTailBuffer.setInt(0, pTail.getLength());
      pTailBuffer.setPointer(Pointer.SIZE, pTail.getPointer());
    }

    WString lpwszFileName = lpszFileName != null ? new WString(lpszFileName) : null;
    boolean result = HPSocket.SDK.HP_TcpServer_SendSmallFile(socketObj, dwConnID, lpwszFileName, pHeadBuffer, pTailBuffer);
   
    if(pMemHead != 0) Native.free(pMemHead);
    if(pMemTail != 0) Native.free(pMemTail);
   
    return result;
  }
 
  /* ****************************** TCP Server 属性访问方法 ******************************** */

  /** 设置 Accept 预投递数量(根据负载调整设置,Accept 预投递数量越大则支持的并发连接请求越多) */
  public void setAcceptSocketCount(int dwAcceptSocketCount)
  {
    HPSocket.SDK.HP_TcpServer_SetAcceptSocketCount(socketObj, dwAcceptSocketCount);
  }
 
  /** 设置通信数据缓冲区大小(根据平均通信数据包大小调整设置,通常设置为 1024 的倍数) */
  public void setSocketBufferSize(int dwSocketBufferSize)
  {
    HPSocket.SDK.HP_TcpServer_SetSocketBufferSize(socketObj, dwSocketBufferSize);
  }
 
  /** 设置监听 Socket 的等候队列大小(根据并发连接数量调整设置) */
  public void setSocketListenQueue(int dwSocketListenQueue)
  {
    HPSocket.SDK.HP_TcpServer_SetSocketListenQueue(socketObj, dwSocketListenQueue);
  }
 
  /** 设置心跳包间隔(毫秒,0 则不发送心跳包) */
  public void setKeepAliveTime(int dwKeepAliveTime)
  {
    HPSocket.SDK.HP_TcpServer_SetKeepAliveTime(socketObj, dwKeepAliveTime);
  }
 
  /** 设置心跳确认包检测间隔(毫秒,0 不发送心跳包,如果超过若干次 [默认:WinXP 5 次, Win7 10 次] 检测不到心跳确认包则认为已断线) */
  public void setKeepAliveInterval(int dwKeepAliveInterval)
  {
    HPSocket.SDK.HP_TcpServer_SetKeepAliveInterval(socketObj, dwKeepAliveInterval);
  }

  /** 获取 Accept 预投递数量 */
  public int getAcceptSocketCount()
  {
    return HPSocket.SDK.HP_TcpServer_GetAcceptSocketCount(socketObj);
  }
 
  /** 获取通信数据缓冲区大小 */
  public int getSocketBufferSize()
  {
    return HPSocket.SDK.HP_TcpServer_GetSocketBufferSize(socketObj);
  }
 
  /** 获取监听 Socket 的等候队列大小 */
  public int getSocketListenQueue()
  {
    return HPSocket.SDK.HP_TcpServer_GetSocketListenQueue(socketObj);
  }
 
  /** 获取心跳检查次数 */
  public int getKeepAliveTime()
  {
    return HPSocket.SDK.HP_TcpServer_GetKeepAliveTime(socketObj);
  }
 
  /** 获取心跳检查间隔 */
  public int getKeepAliveInterval()
  {
    return HPSocket.SDK.HP_TcpServer_GetKeepAliveInterval(socketObj);
  }

  /* ***************************** TCP Pull Server 组件操作方法 **************************** */
 
  /**
  * 抓取数据
  */
  public int fetch(NativeLong dwConnID, byte[] pBuffer, int iLength)
  {
    return HPSocket.SDK.HP_TcpPullServer_Fetch(socketObj, dwConnID, pBuffer, iLength);
  }

}
TOP

Related Classes of org.jessma.hpsocket.unicode.TcpServer

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.